﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Text;
using BCCommon;
using BCEntity.MakeStaticPagingComponent.WebsiteTemplate;
using Dapper;

namespace BCData.MakeStaticPagingComponent.WebsiteTemplate
{
    /// <summary>
    /// 网站模板信息数据处理
    /// </summary>
    public class WebsiteTemplateData : IWebsiteTemplateData
    {
        private readonly IDatabaseContext databaseContext;
        private const string QUERY = @"SELECT WebsiteTemplateId,TemplateName,TemplateUniqueCode,Url,ShowImage,IsUsed,IsFree,IsDownloaded,Price,Paid,PaidTime,DownloadToken,CreateTime,UpdateTime FROM WebsiteTemplate";
        public WebsiteTemplateData(IDatabaseContext databaseContext)
        {
            this.databaseContext=databaseContext;
        }

        public WebsiteTemplateEntity Add(WebsiteTemplateEntity websiteTemplateEntity)
        {
            string sql = @"INSERT INTO WebsiteTemplate(TemplateName,Url,ShowImage,IsUsed,IsFree,IsDownloaded,Price,TemplateUniqueCode)
                                        VALUES(?TemplateName,?Url,?ShowImage,?IsUsed,?IsFree,?IsDownloaded,?Price,UUID_SHORT());";
            sql = string.Format("{0} {1} WHERE WebsiteTemplateId=LAST_INSERT_ID();", sql, QUERY);
            DynamicParameters parameters = new DynamicParameters();
            parameters.Add("?TemplateName", websiteTemplateEntity.TemplateName, DbType.AnsiString, size: 50);
            parameters.Add("?Url", websiteTemplateEntity.Url, DbType.AnsiString, size: 1000);
            parameters.Add("?ShowImage", websiteTemplateEntity.ShowImage, DbType.AnsiString, size: 1000);
            parameters.Add("?IsUsed", websiteTemplateEntity.IsUsed, DbType.Boolean);
            parameters.Add("?IsFree", websiteTemplateEntity.IsFree, DbType.Boolean, size: 50);
            parameters.Add("?IsDownloaded", websiteTemplateEntity.IsDownloaded, DbType.Boolean, size: 50);
            parameters.Add("?Price", websiteTemplateEntity.Price, DbType.Decimal);
            return this.databaseContext.Master.QueryEntity<WebsiteTemplateEntity>(sql, parameters, databaseContext.Transaction);
        }

        public void delete(int websiteTemplateId)
        {
            string sql = @"DELETE FROM WebsiteTemplate WHERE WebsiteTemplateId=?WebsiteTemplateId;";
            DynamicParameters parameters = new DynamicParameters();
            parameters.Add("?WebsiteTemplateId", websiteTemplateId, DbType.Int64);
            this.databaseContext.Master.Execute(sql, parameters, databaseContext.Transaction);
        }

        public WebsiteTemplateEntity Get(int websiteTemplateId)
        {
            string sql = string.Concat(QUERY, " WHERE WebsiteTemplateId=?WebsiteTemplateId;");
            DynamicParameters parameters = new DynamicParameters();
            parameters.Add("?WebsiteTemplateId", websiteTemplateId, DbType.Int64);
            return this.databaseContext.Slave.QueryEntity<WebsiteTemplateEntity>(sql, parameters);
        }

        public WebsiteTemplateEntity Get(string templateName)
        {
            string sql = string.Concat(QUERY, " WHERE TemplateName=?TemplateName;");
            DynamicParameters parameters = new DynamicParameters();
            parameters.Add("?TemplateName", templateName, DbType.AnsiString, size: 50);
            return this.databaseContext.Slave.QueryEntity<WebsiteTemplateEntity>(sql, parameters);
        }

        public IEnumerable<WebsiteTemplateEntity> Get()
        {
            return this.databaseContext.Slave.Query<WebsiteTemplateEntity>(QUERY);
        }

        public WebsiteTemplateEntity Update(WebsiteTemplateEntity websiteTemplateEntity)
        {
            string sql = @"UPDATE WebsiteTemplate SET
                                TemplateName=?TemplateName,
                                Url=?Url,
                                ShowImage=?ShowImage,
                                IsUsed=?IsUsed,
                                IsFree=?IsFree,
                                IsDownloaded=?IsDownloaded,
                                Price=?Price
                            WHERE WebsiteTemplateId=?WebsiteTemplateId;";
            sql = string.Format("{0} {1} WHERE WebsiteTemplateId=?WebsiteTemplateId;", sql, QUERY);
            DynamicParameters parameters = new DynamicParameters();
            parameters.Add("?WebsiteTemplateId", websiteTemplateEntity.WebsiteTemplateId, DbType.Int64);
            parameters.Add("?TemplateName", websiteTemplateEntity.TemplateName, DbType.AnsiString, size: 50);
            parameters.Add("?Url", websiteTemplateEntity.Url, DbType.AnsiString, size: 1000);
            parameters.Add("?ShowImage", websiteTemplateEntity.ShowImage, DbType.AnsiString, size: 1000);
            parameters.Add("?IsUsed", websiteTemplateEntity.IsUsed, DbType.Boolean);
            parameters.Add("?IsFree", websiteTemplateEntity.IsFree, DbType.Boolean, size: 50);
            parameters.Add("?IsDownloaded", websiteTemplateEntity.IsDownloaded, DbType.Boolean, size: 50);
            parameters.Add("?Price", websiteTemplateEntity.Price, DbType.Decimal);
            return this.databaseContext.Master.QueryEntity<WebsiteTemplateEntity>(sql, parameters, databaseContext.Transaction);
        }

        public bool UpdateWebsiteTemplateIsUsed(int websiteTemplateId)
        {
            string sql = @"UPDATE WebsiteTemplate SET
                                IsUsed=0;
                            UPDATE WebsiteTemplate SET
                                IsUsed=1
                            WHERE WebsiteTemplateId=?WebsiteTemplateId;";
            DynamicParameters parameters = new DynamicParameters();
            parameters.Add("?WebsiteTemplateId", websiteTemplateId, DbType.Int64);
            int result = this.databaseContext.Master.Execute(sql, parameters, databaseContext.Transaction);
            return result > 0;
        }

        public bool CheckWebsiteTemplateExists(string templateName)
        {
            string sql = @"SELECT 1 FROM WebsiteTemplate WHERE TemplateName=?TemplateName LIMIT 1;";
            DynamicParameters parameters = new DynamicParameters();
            parameters.Add("?TemplateName", templateName, DbType.AnsiString, size: 50);
            object result = this.databaseContext.Slave.ExecuteScalar(sql, parameters);
            return result != null;
        }

        public bool CheckWebsiteTemplateExists(int websiteTemplateId)
        {
            string sql = @"SELECT 1 FROM WebsiteTemplate WHERE WebsiteTemplateId=?WebsiteTemplateId LIMIT 1;";
            DynamicParameters parameters = new DynamicParameters();
            parameters.Add("?WebsiteTemplateId", websiteTemplateId, DbType.Int64);
            object result = this.databaseContext.Slave.ExecuteScalar(sql, parameters);
            return result != null;
        }

        public IEnumerable<WebsiteTemplateEntity> Get(string templateName, decimal? minPrice, decimal? maxPrice, DateTime? start, DateTime? end, string sortField, bool? ascending, out int dataCount, int pageIndex = 1, int pageSize = 10)
        {
            List<string> wheres = new List<string>();
            DynamicParameters parameters = new DynamicParameters();
            if (!string.IsNullOrWhiteSpace(templateName))
            {
                wheres.Add("TemplateName LIKE CONCAT('%',?TemplateName,'%')");
                parameters.Add("?TemplateName", templateName, DbType.AnsiString, size: 50);
            }
            if (minPrice.HasValue && !maxPrice.HasValue)
            {
                wheres.Add("Price>=?MinPrice");
                parameters.Add("?MinPrice", minPrice.Value, DbType.Decimal);
            }
            else if (!minPrice.HasValue && maxPrice.HasValue)
            {
                wheres.Add("Price<=?MaxPrice");
                parameters.Add("?MaxPrice", maxPrice.Value, DbType.Decimal);
            }
            else if (minPrice.HasValue && maxPrice.HasValue)
            {
                wheres.Add("Price>=?MinPrice AND Price<=?MaxPrice");
                parameters.Add("?MinPrice", minPrice.Value, DbType.Decimal);
                parameters.Add("?MaxPrice", maxPrice.Value, DbType.Decimal);
            }
            if (start.HasValue && !end.HasValue)
            {
                wheres.Add("CreateTime>=?Start");
                parameters.Add("?Start", start.Value, DbType.DateTime);
            }
            else if (!start.HasValue && end.HasValue)
            {
                wheres.Add("CreateTime<=?End");
                parameters.Add("?End", end.Value, DbType.DateTime);
            }
            else if (start.HasValue && end.HasValue)
            {
                wheres.Add("CreateTime>=?Start AND CreateTime<=?End");
                parameters.Add("?Start", start.Value, DbType.DateTime);
                parameters.Add("?End", end.Value, DbType.DateTime);
            }
            string sql = string.Format(@"{0} {1} ORDER BY {5} {4} LIMIT {2},{3}; 
                               SELECT Count(1) FROM WebsiteTemplate {1}",
                  QUERY,
                  wheres.Count > 0 ? " WHERE " + string.Join(" AND ", wheres) : "",
                  (pageIndex == 0 ? 0 : pageIndex - 1) * pageSize,
                  pageSize,
                  ascending.HasValue && ascending.Value ? "ASC" : "DESC",
                  string.IsNullOrWhiteSpace(sortField) ? "CreateTime" : sortField);

            var result = this.databaseContext.Slave.QueryMultiple<WebsiteTemplateEntity, int>(sql, parameters);

            dataCount = result.Item2;

            return result.Item1;
        }

        public WebsiteTemplateEntity GetUsed()
        {
            string sql = string.Format("{0} WHERE IsUsed=1", QUERY);
            return this.databaseContext.Slave.QueryEntity<WebsiteTemplateEntity>(sql);
        }
    }
}
